package gomz.pres.question;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import gomz.GlobalRes;
import gomz.pres.ModelMain;
import gomz.res.Hexagram;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * Diese Klasse steuert das UI des uebergebenen Hexagramms. Es reagiert auf die Eingaben des Benutzers.
 * @author Murillo
 */
public class CQHexagram {
	// ********************************************************************************
	// Variablen
	// ********************************************************************************
	//private MQuestion model;
	private ModelMain model;
	private GUIQHexagram view;
	private int hexTyp;			//Kontext, Perspektiv, Komplementaer, Wende, Nuklear, Fuxi, Linien 1-6
	private JFrame pWindow;
	private boolean isStartetFromHexadmin;	//Variable ob das Fenster in der Verwaltung oder aus der Fragestellung geoeffnet wird
	//*********************************************************************************
	// Konstruktor
	// ********************************************************************************
	/**
	 * Konstruktor fuer den Controller der Hexagramme
	 * @param pWindow Vaterfenster fuer JDialogs
	 * @param view Das zu verltende (Control) UI
	 * @param model Das Model mit den Daten
	 * @param hexType Hexagramtyp der angezeigt werden soll
	 * @param isStartetFromHexadmin Boolean ob das Fenster aus der Verwaltung oder aus der Fragestellung geoeffnet wird
	 */
	public CQHexagram(JFrame pWindow, GUIQHexagram view, ModelMain model, int hexType, boolean isStartetFromHexadmin) {
		this.model = model;
		this.view = view;
		this.hexTyp = hexType;
		this.pWindow = pWindow;
		this.isStartetFromHexadmin = isStartetFromHexadmin;
		addListener();
	}
	// ********************************************************************************
	// Listener
	// ********************************************************************************
	/**
	 * Diese Methode fuegt die Listeners hinzu
	 */
	private void addListener(){
		//Buttons**********************************************************************
		//Speichern
		view.getBtKsave().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doSave();
			}
		});
		//Zuruecksetzen
		view.getBtKcancel().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doCancel();	
			}
		});
		//Listen************************************************************************
		//Textauswahl
		view.getLiKlist().addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				//da das event vorkommt, wenn ein Feld deselektiert wird und wenn es seleltiert wird
				if (e.getValueIsAdjusting() == false){
					int lineNr = -1;
					if(hexTyp >= 6){
						if(view.getRbLine1().isSelected())		lineNr = 5;
						else if(view.getRbLine2().isSelected())	lineNr = 4;
						else if(view.getRbLine3().isSelected())	lineNr = 3;
						else if(view.getRbLine4().isSelected())	lineNr = 2;
						else if(view.getRbLine5().isSelected())	lineNr = 1;
						else if(view.getRbLine6().isSelected())	lineNr = 0;
					}
					doTextChange(view.getLiKlist().getSelectedIndex(), lineNr);
				}
			}
		});
		
		//Listener fuer Linienhexagramauswahl
		if(hexTyp >= 6){
			//oberste Linie 5
			view.getRbLine1().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					doHexLineChange(5);
					doTextChange(view.getLiKlist().getSelectedIndex(), 5);
				}
			});
			//Linie 4
			view.getRbLine2().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					doHexLineChange(4);
					doTextChange(view.getLiKlist().getSelectedIndex(), 4);
				}
			});
			//Linie 3
			view.getRbLine3().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					doHexLineChange(3);
					doTextChange(view.getLiKlist().getSelectedIndex(), 3);
				}
			});
			//Linie 2
			view.getRbLine4().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					doHexLineChange(2);
					doTextChange(view.getLiKlist().getSelectedIndex(), 2);
				}
			});
			//Linie 1
			view.getRbLine5().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					doHexLineChange(1);
					doTextChange(view.getLiKlist().getSelectedIndex(), 1);
				}
			});
			//Linie 0
			view.getRbLine6().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					doHexLineChange(0);
					doTextChange(view.getLiKlist().getSelectedIndex(), 0);
				}
			});
		}
	}
	
	// ********************************************************************************
	// Methoden
	// ********************************************************************************
	/**
	 * Diese Methode fuellt das UI mit Daten
	 */
	public void fillData(){
		//Name des Hexagramms setzten
		if(model.getHexagram() != null)	view.getLbKlinesName().setText(model.getHexagram().getName());
		//Falls es ein Linien soll die oberste linie asgewaehlt werden, die lienie mutiert und der dazugehoerige text angezeigt werden
		if(hexTyp >=6 && (!view.getRbLine1().isSelected() || !view.getRbLine2().isSelected() || !view.getRbLine3().isSelected() || !view.getRbLine4().isSelected() ||!view.getRbLine5().isSelected()||!view.getRbLine6().isSelected())){
			view.getRbLine1().setSelected(true);
			doHexLineChange(5);

			int lineNr = -1;
			
			if(view.getRbLine1().isSelected())		lineNr = 5;
			else if(view.getRbLine2().isSelected())	lineNr = 4;
			else if(view.getRbLine3().isSelected())	lineNr = 3;
			else if(view.getRbLine4().isSelected())	lineNr = 2;
			else if(view.getRbLine5().isSelected())	lineNr = 1;
			else if(view.getRbLine6().isSelected())	lineNr = 0;
			
			doTextChange(view.getLiKlist().getSelectedIndex(), lineNr);
		}
	}
	
	/**
	 * Diese Methode aendert den Text der Hexagramme bzw der des Mutierten bei den Linienhexagrammen
	 * @param textId Die Textart ([0]Kommentar, [1] Urtrei, [2] Bild, Linien 1-6)
	 * @param lineNr Bie linienhexagrammen die zu mutierende Linie ansonsten -1
	 */
	public void doTextChange(int textId, int lineNr){
		//Es sollte nie vorkommen, dass das Hexagram null ist, da dieser Tab erst aktiviert wird, wenn ein Hexagram ausgewaehlt wurde
		Hexagram hex = null;
		//aktuelles Hexagramm setzten
		if(hexTyp <6)						hex = model.getHexagram();
		else if (model.getQuestion() != null)	hex = model.getQuestion().getHex()[6+lineNr];
			
		//Hexagrammtexte setzten
		if(hex != null){
			switch(textId){
			default:
				break;
			case 0:
				//Kommentar
				view.getTaKtxt().setText(hex.getComment()[0]);
				view.getTaKkom().setText(hex.getComment()[1]);
				break;
			case 1:
				//Urteil
				view.getTaKtxt().setText(hex.getJudgement()[0]);
				view.getTaKkom().setText(hex.getJudgement()[1]);
				break;
			case 2:
				//Bild
				view.getTaKtxt().setText(hex.getImage()[0]);
				view.getTaKkom().setText(hex.getImage()[1]);
				break;
			case 3:
				//Linie 1
				view.getTaKtxt().setText(hex.getLine1()[0]);
				view.getTaKkom().setText(hex.getLine1()[1]);
				break;
			case 4:
				//Linie 2
				view.getTaKtxt().setText(hex.getLine2()[0]);
				view.getTaKkom().setText(hex.getLine2()[1]);
				break;
			case 5:
				//Linie 3
				view.getTaKtxt().setText(hex.getLine3()[0]);
				view.getTaKkom().setText(hex.getLine3()[1]);
				break;
			case 6:
				//Linie 4
				view.getTaKtxt().setText(hex.getLine4()[0]);
				view.getTaKkom().setText(hex.getLine4()[1]);
				break;
			case 7:
				//Linie 5
				view.getTaKtxt().setText(hex.getLine5()[0]);
				view.getTaKkom().setText(hex.getLine5()[1]);
				break;
			case 8:
				//Linie 6
				view.getTaKtxt().setText(hex.getLine6()[0]);
				view.getTaKkom().setText(hex.getLine6()[1]);
				break;
			}
		}
		//Possition an den Anfgan der Textarea setzten
		view.getTaKtxt().setCaretPosition(0);
		view.getTaKkom().setCaretPosition(0);
	}
	
	/**
	 * Diese Methode zeichnet das linke Hexagramm aus den einzeilnen Linien
	 * Bei Linienhexagrammen wird das Kontexthexagramm dargestellt
	 */
	public void setHexLines(){
		//hexLines[0] = unterste linie, getLbLine2() = oberste linie
		//model.getQuestion().getLineHexagramId(lines)
		if (model.getHexagram() != null){
			int[] hexLines = model.getHexagram().getLineType();
			
			//hexLines: 0 steht fuer yang (durchgezogene Linie), 1 steht fuer Yin (unterbrochene Linie)
			//ImgLine: 1 steht fuer yang (durchgezogene Linie), 2 steht fuer Yin (unterbrochene Linie);
			view.getLbLine1().setIcon((hexLines[5] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLbLine2().setIcon((hexLines[4] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLbLine3().setIcon((hexLines[3] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLbLine4().setIcon((hexLines[2] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLbLine5().setIcon((hexLines[1] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLbLine6().setIcon((hexLines[0] == 0) ? view.getImgLine1() : view.getImgLine2());
		}
	}
	
	/**
	 * Diese Methode speichert Aenderungen am Kommentar des Hexagrammtextes
	 */
	public void doSave(){
		int textId = view.getLiKlist().getSelectedIndex();
		int lineId = 0;
		//Falls eine Textart ausgewaehlt wurde
		if (textId != -1){
			Hexagram hex = new Hexagram(model.getHexagram());
			//Zu speicherndes Hexagram ueber einen Copykonstruktor duplizieren
			if(hexTyp < 6){
				//hex = model.getHexagram();
				hex = new Hexagram(model.getHexagram());
			}
			else if(model.getQuestion() != null){
				if(view.getRbLine1().isSelected())		lineId = 6+5;
				else if(view.getRbLine2().isSelected())	lineId = 6+4;
				else if(view.getRbLine3().isSelected())	lineId = 6+3;
				else if(view.getRbLine4().isSelected())	lineId = 6+2;
				else if(view.getRbLine5().isSelected())	lineId = 6+1;
				else if(view.getRbLine6().isSelected())	lineId = 6+0;
				hex = new Hexagram(model.getQuestion().getHex()[lineId]);
			}
			String[] tmpArr = new String[2];
			
			//Texte aus dem Textfeldern lesen und ins Hexagramm speichern
			//Falls das UI von der Hexagrammadministration aus gespeichert wurde und der Benutzer ein Admin ist,
			//werden der Kommentar und der Originaltext gespeichert. Falls nicht nur der Kommentar.
			switch(textId){
			default:
				break;
			case 0:
				//Kommentar
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getComment()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setComment(tmpArr);
				break;
			case 1:
				//Urteil
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getJudgement()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setJudgement(tmpArr);
				break;
			case 2:
				//Bild
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getImage()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setImage(tmpArr);
				break;
			case 3:
				//Linie 1
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getLine1()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setLine1(tmpArr);
				break;
			case 4:
				//Linie 2
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getLine2()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setLine2(tmpArr);
				break;
			case 5:
				//Linie 3
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getLine3()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setLine3(tmpArr);
				break;
			case 6:
				//Linie 4
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getLine4()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setLine4(tmpArr);
				break;
			case 7:
				//Linie 5
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getLine5()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setLine5(tmpArr);
				break;
			case 8:
				//Linie 6
				if(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin())	tmpArr[0] = view.getTaKtxt().getText();
				else															tmpArr[0] = hex.getLine6()[0];
				tmpArr[1] = view.getTaKkom().getText();
				hex.setLine6(tmpArr);
				break;
			}
			//Falls das UI von der Hexagramadministration gestartet wurde und der Angemeldete benutzer ein Admin ist,
			//wird dem Server zusaetzlich dies mitgeteilt, damit er den Originaltext ebenfalls aendert.
			if (!model.saveHexagram(hex,(isStartetFromHexadmin && GlobalRes.getActivUser().isAdmin() ? true : false))){
				//Meldung an den Benutzer, falls der Vorgang nicht durchgefuehrt werden konnte
				JOptionPane.showMessageDialog(pWindow, "Das Hexagramm konnte nicht gespeichert werden.", "Hexagramm speichern", JOptionPane.ERROR_MESSAGE);
			}
			else if(!isStartetFromHexadmin){
				//Falls die Speichern nicht von der Hexagrammadministration aus gestartet wird, wird die aktuelle
				//Fragestellung neu geladen, um alle Hexagramme in der Fragestellung aktuell zu halten
				model.openQuestion(model.getQuestion().getId());
				model.setHexagram(model.getQuestion().getHex()[hexTyp]);
			}
		}
		else{
			JOptionPane.showMessageDialog(pWindow, "Das Hexagramm konnte nicht gespeichert werden.", "Hexagramm speichern", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	/**
	 * Diese Methode setzt die Daten auf dem UI zurueck
	 */
	public void doCancel(){
		if(hexTyp < 6){
			doTextChange(view.getLiKlist().getSelectedIndex(), -1);
		}
		else{
			if(view.getRbLine1().isSelected())		doTextChange(view.getLiKlist().getSelectedIndex(), 5);
			else if(view.getRbLine2().isSelected())	doTextChange(view.getLiKlist().getSelectedIndex(), 4);
			else if(view.getRbLine3().isSelected())	doTextChange(view.getLiKlist().getSelectedIndex(), 3);
			else if(view.getRbLine4().isSelected())	doTextChange(view.getLiKlist().getSelectedIndex(), 2);
			else if(view.getRbLine5().isSelected())	doTextChange(view.getLiKlist().getSelectedIndex(), 1);
			else if(view.getRbLine6().isSelected())	doTextChange(view.getLiKlist().getSelectedIndex(), 0);
		}
	}
	
	/**
	 * Diese Methode zeichnet das mutierte Linienhexagram
	 * @param lineNr Linie welche mutiert wird (0 als unterste linie)
	 */
	public void doHexLineChange(int lineNr){
		if (model.getQuestion()!=null){
			int[] hexLines = model.getQuestion().getHex()[6+lineNr].getLineType();
			view.getLb2Line1().setIcon((hexLines[5] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLb2Line2().setIcon((hexLines[4] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLb2Line3().setIcon((hexLines[3] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLb2Line4().setIcon((hexLines[2] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLb2Line5().setIcon((hexLines[1] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLb2Line6().setIcon((hexLines[0] == 0) ? view.getImgLine1() : view.getImgLine2());
			view.getLbKlines2Name().setText(model.getQuestion().getHex()[6+lineNr].getName());
		}
	}
	
	/**
	 * Diese Methode setzt die Editierbarkeit des Textfeld mit den Original Hexagramtexten auf true oder false
	 * @param isAdmin Boolean ob das Textfeld mit den Original Hexagramtexten editierbar sein soll
	 */
	public void setOriTextEditable(boolean isAdmin){
		view.getTaKtxt().setEditable(isAdmin);
	}
}
